#ifndef LOGGER_H
#define LOGGER_H

#include <memory>
#include <spdlog/logger.h>
#include <string>

// 定义日志模块注册宏，类似于Zephyr的LOG_MODULE_REGISTER
#define LOG_MODULE_REGISTER(tag) \
    static auto __logger_instance = multi_sink::Logger::createLogger(tag); \
    static multi_sink::Logger* get_module_logger() { return __logger_instance.get(); } \
    static void reset_module_logger() { __logger_instance.reset(); }

// C++接口
namespace multi_sink {
    
    /**
     * @brief 多sink日志记录器类
     */
    class Logger {
    public:
        /**
         * @brief 获取单例实例
         * 
         * @return Logger& 单例实例引用
         */
        static Logger& getInstance();
        
        /**
         * @brief 创建带标记的新日志记录器实例
         * 
         * @param tag 日志标记
         * @return std::shared_ptr<Logger> 新的日志记录器实例
         */
        static std::shared_ptr<Logger> createLogger(const std::string& tag);
        
        /**
         * @brief 初始化日志记录器
         * 
         * @param tag 日志标记
         * @return int 0表示成功，-1表示失败
         */
        int init(const std::string& tag = "");
        
        /**
         * @brief 释放日志记录器资源
         */
        void destroy();
        
        /**
         * @brief 记录信息级别日志
         * 
         * @param format 格式化字符串
         * @param args 可变参数列表
         */
        template<typename... Args>
        void info(const char* format, Args&&... args) {
            if (logger_) {
                logger_->info(format, std::forward<Args>(args)...);
            }
        }
        
        /**
         * @brief 获取当前日志记录器实例
         * 
         * @return std::shared_ptr<spdlog::logger> spdlog记录器实例
         */
        std::shared_ptr<spdlog::logger> get_spdlog_logger() const {
            return logger_;
        }
        
        /**
         * @brief 记录警告级别日志
         * 
         * @param format 格式化字符串
         * @param args 可变参数列表
         */
        template<typename... Args>
        void warn(const char* format, Args&&... args) {
            if (logger_) {
                logger_->warn(format, std::forward<Args>(args)...);
            }
        }
        
        /**
         * @brief 记录错误级别日志
         * 
         * @param format 格式化字符串
         * @param args 可变参数列表
         */
        template<typename... Args>
        void error(const char* format, Args&&... args) {
            if (logger_) {
                logger_->error(format, std::forward<Args>(args)...);
            }
        }
        
    private:
        /**
         * @brief 默认构造函数
         */
        Logger() = default;
        
        /**
         * @brief 带标记的构造函数
         * 
         * @param tag 日志标记
         */
        explicit Logger(const std::string& tag);
        
        // 删除拷贝构造函数和赋值操作符
        Logger(const Logger&) = delete;
        Logger& operator=(const Logger&) = delete;
        
        // 日志记录器指针
        std::shared_ptr<spdlog::logger> logger_ = nullptr;
        
        // 日志标记
        std::string tag_;
    };

} // namespace multi_sink

// 定义简化日志记录宏，类似于Zephyr的LOG_INF, LOG_WRN等
#define LOG_INF(fmt, ...) \
    do { \
        if (get_module_logger()) { \
            get_module_logger()->info(fmt, ##__VA_ARGS__); \
        } \
    } while (0)

#define LOG_WRN(fmt, ...) \
    do { \
        if (get_module_logger()) { \
            get_module_logger()->warn(fmt, ##__VA_ARGS__); \
        } \
    } while (0)

#define LOG_ERR(fmt, ...) \
    do { \
        if (get_module_logger()) { \
            get_module_logger()->error(fmt, ##__VA_ARGS__); \
        } \
    } while (0)
#endif // LOGGER_H